#pragma once
#include <iostream>
#include <string>
using namespace std;


class abstr_emp
{
public:
	abstr_emp();
	abstr_emp(const string&fn, const string& ln, const string& job);
	virtual void ShowAll()const;
	virtual void SetAll();
	friend ostream& operator<<(ostream& os, const abstr_emp& e);
	virtual ~abstr_emp() = 0;
private:
	string fname;
	string lname;
	string job;
};

class employee :public abstr_emp
{
public:
	employee();
	employee(const string& fn, const string& ln, const string& job);
	virtual void ShowAll()const;
	virtual void SetAll();
};

class manager :virtual public abstr_emp
{
public:
	manager();
	manager(const string& fn, const string& ln, const string& job,int ico=0);
	manager(const abstr_emp& e, int ico);
	manager(const manager& m);
	virtual void ShowAll()const;
	virtual void SetAll();
protected:
	int InChargeOf()const { return inchargeof; }
	int & InChargeOf(){ return inchargeof; }
private:
	int inchargeof;
};

class fink :virtual public abstr_emp
{
public:
	fink();
	fink(const string& fn, const string& ln, const string& job,const string&rpo);
	fink(const abstr_emp& e, const string& rpo);
	fink(const fink& e);
	virtual void ShowAll()const;
	virtual void SetAll();
protected:
	const string ReportsTo()const { return reportsto; }
	string& ReportsTo() { return reportsto; }
private:
	string reportsto;
};

class highfink :public manager, public fink
{
public:
	highfink();
	highfink(const string& fn, const string& ln, const string& job, const string& rpo,int ico);
	highfink(const abstr_emp& e, const string& rpo, int ico);
	highfink(const fink& f, int ico);
	highfink(const manager& m, const string& rpo);
	highfink(const highfink& h);
	virtual void ShowAll()const;
	virtual void SetAll();
};